package com.hpe.wx.system.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.hpe.wx.performance.redis.utils.PropertiesUtils;
 

/**
 * @ClassName: FileDownLoadCtrl
 *
 * @Description: 下载文件啦，啦，啦，啦……
 *
 * @author 吴雄 wux@sun3d.com
 *
 * @date 2014年7月4日 上午11:22:37
 * 
 */
@Controller
@RequestMapping(value = "/fileDownload")
public class FileDownLoadCtrl {
	
	/** 
	 * @Title: download 
	 *
	 * @Description: TODO(这里用一句话描述这个方法的作用) 
	 *
	 * @param @param request
	 * @param @param response
	 * @param @param fileName      需要下载的文件的文件名
	 * @param @param fileType	         文件类型（因为不同的类型的文件的存放路径是不同的）
	 * @param @throws Exception    设定文件 
	 */
	@RequestMapping(value = "/download", method = RequestMethod.GET)
	public void download(HttpServletRequest request,
			HttpServletResponse response, String fileName,String fileType) throws Exception {
		if (!StringUtils.isEmpty(fileName)) {
			String fileDownloadFolder;
			if("pic".equals(fileType)){//图片文件
				fileDownloadFolder = PropertiesUtils.getProperty("imagestorepath");
			}else{//其他文件
				fileDownloadFolder = PropertiesUtils.getProperty("filestorepath");
			}

			fileName = URLDecoder.decode(fileName, "UTF-8");
			String filePath ;
			if(!fileName.contains(File.separator)){
				filePath = fileDownloadFolder + fileName;
			} else {
				filePath = fileName;
			}
			

			File file2Download = new File(filePath);

			if (null != file2Download && file2Download.exists()
					&& file2Download.length() > 0) {

				// 以流的形式下载文件。
				InputStream fis = new BufferedInputStream(new FileInputStream(
						file2Download));

				/**
				 * 
				 * 这里将文件按照每次1024个字节读取到一个list中
				 * **/
				int c;
				byte[] buffer = new byte[1024];
				List<Byte> listTemp = new ArrayList<Byte>();
				while ((c = fis.read(buffer)) != -1) {// 这里的byte 数组怎么处理？
					for (int i = 0; i < c; i++) {// out.write(buffer[i]);
						listTemp.add(buffer[i]);
					}
					buffer = new byte[1024];// 重新覆盖掉以前的内容
				}
				fis.close();
				// /////////////读取完毕

				/**
				 * 
				 * 这里将文件按照每次1个字节向浏览器输出文件
				 **/
				// 清空response
				response.reset();

				if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0){
					fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器
				}else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0 ){
					fileName = URLEncoder.encode(fileName, "UTF-8");//IE浏览器
				}else{// 其他浏览器    chrome 之类的      牛逼的写法
					fileName = URLEncoder.encode(fileName, "UTF-8");
				}
				
				// 设置response的Header
				response.setHeader( "Content-Disposition",
						"attachment;filename=\"" + fileName + "\"");//
				response.addHeader("Content-Length",
						"" + file2Download.length());

				OutputStream toClient = new BufferedOutputStream(
						response.getOutputStream());
				response.setContentType("application/octet-stream");

				// while
				for (int i = 0; i < listTemp.size(); i++) {
					toClient.write(listTemp.get(i));
				}
				toClient.flush();
				toClient.close();
			}
		}
	}
}
